package com.kexio.core.security.service;

import java.util.List;

/**
 * RBAC权限控制服务接口
 *
 * @author Kexio Team
 * @since 1.0.0
 */
public interface RbacService {

    /**
     * 检查用户是否拥有指定角色
     *
     * @param userId 用户ID
     * @param role   角色标识
     * @return 是否拥有该角色
     */
    boolean hasRole(Long userId, String role);

    /**
     * 检查当前用户是否拥有指定角色
     *
     * @param role 角色标识
     * @return 是否拥有该角色
     */
    boolean hasRole(String role);

    /**
     * 检查用户是否拥有任意指定角色
     *
     * @param userId 用户ID
     * @param roles  角色标识数组
     * @return 是否拥有任意一个角色
     */
    boolean hasAnyRole(Long userId, String... roles);

    /**
     * 检查当前用户是否拥有任意指定角色
     *
     * @param roles 角色标识数组
     * @return 是否拥有任意一个角色
     */
    boolean hasAnyRole(String... roles);

    /**
     * 检查用户是否拥有指定权限
     *
     * @param userId     用户ID
     * @param permission 权限标识
     * @return 是否拥有该权限
     */
    boolean hasPermission(Long userId, String permission);

    /**
     * 检查当前用户是否拥有指定权限
     *
     * @param permission 权限标识
     * @return 是否拥有该权限
     */
    boolean hasPermission(String permission);

    /**
     * 检查用户是否拥有任意指定权限
     *
     * @param userId      用户ID
     * @param permissions 权限标识数组
     * @return 是否拥有任意一个权限
     */
    boolean hasAnyPermission(Long userId, String... permissions);

    /**
     * 检查当前用户是否拥有任意指定权限
     *
     * @param permissions 权限标识数组
     * @return 是否拥有任意一个权限
     */
    boolean hasAnyPermission(String... permissions);

    /**
     * 检查用户是否拥有全部指定权限
     *
     * @param userId      用户ID
     * @param permissions 权限标识数组
     * @return 是否拥有全部权限
     */
    boolean hasAllPermissions(Long userId, String... permissions);

    /**
     * 检查当前用户是否拥有全部指定权限
     *
     * @param permissions 权限标识数组
     * @return 是否拥有全部权限
     */
    boolean hasAllPermissions(String... permissions);

    /**
     * 获取用户的所有角色
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    List<String> getUserRoles(Long userId);

    /**
     * 获取用户的所有权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    List<String> getUserPermissions(Long userId);

    /**
     * 检查用户是否为超级管理员
     *
     * @param userId 用户ID
     * @return 是否为超级管理员
     */
    boolean isAdmin(Long userId);

    /**
     * 检查当前用户是否为超级管理员
     *
     * @return 是否为超级管理员
     */
    boolean isAdmin();

    /**
     * 检查用户是否可以访问指定资源
     *
     * @param userId   用户ID
     * @param resource 资源标识
     * @param action   操作类型
     * @return 是否可以访问
     */
    boolean canAccess(Long userId, String resource, String action);

    /**
     * 检查当前用户是否可以访问指定资源
     *
     * @param resource 资源标识
     * @param action   操作类型
     * @return 是否可以访问
     */
    boolean canAccess(String resource, String action);

    /**
     * 检查用户是否可以对指定数据进行操作(数据权限控制)
     *
     * @param userId   用户ID
     * @param dataType 数据类型
     * @param dataId   数据ID
     * @param action   操作类型
     * @return 是否可以操作
     */
    boolean canOperateData(Long userId, String dataType, Long dataId, String action);

    /**
     * 检查当前用户是否可以对指定数据进行操作(数据权限控制)
     *
     * @param dataType 数据类型
     * @param dataId   数据ID
     * @param action   操作类型
     * @return 是否可以操作
     */
    boolean canOperateData(String dataType, Long dataId, String action);
}
